#include <iostream>
#include <list>
/*

构造函数：
    list(): 默认构造函数。
    explicit list(size_type count, const T& value = T()): 构造包含 count 个元素的列表，每个元素都是 value。
    list(const list& other): 复制构造函数。

迭代器：
    begin(), end(): 返回指向列表起始和结束的迭代器。
    rbegin(), rend(): 返回指向逆序列表的起始和结束的逆序迭代器。

容量：
    empty(): 检查列表是否为空。
    size(): 返回列表中元素的数量。

修改操作：
    push_back(const T& value): 在列表末尾添加元素。
    pop_back(): 删除列表末尾的元素。
    push_front(const T& value): 在列表头部添加元素。
    pop_front(): 删除列表头部的元素。
    insert(iterator pos, const T& value): 在指定位置插入元素。
    erase(iterator pos): 删除指定位置的元素。
    remove(const T& value): 删除列表中所有等于 value 的元素。

访问元素：
    front(): 返回列表头部的元素。
    back(): 返回列表末尾的元素。

其他操作：
    splice(iterator pos, list& other): 将另一个列表 other 移动到指定位置 pos 前面。
    sort(): 对列表进行排序。
    reverse(): 反转列表中的元素。

注意：
std::list 提供了双向迭代器，但不支持随机访问。因此，不能像 std::vector 一样通过 begin() + n 的方式直接访问第 n 个元素。

*/

template <typename E>
void printList(const std::list<E> &list)
{
#if 0
    for (typename std::list<E>::const_iterator it = list.begin(); it != list.end(); it++)
    {
        std::cout << *it << " ";
    }
#else
    for (const E &ele : list)
    {
        std::cout << ele << " ";
    }

#endif
    std::cout << std::endl;
}

int main(int argc, char const *argv[])
{
    std::list<int> list = {1, 3, 2, 4, 0, 1, 2, 6, 4, 0};
    printList(list);

    // push_back(const T& value): 在列表末尾添加元素。
    list.push_back(999);
    printList(list);

    // pop_back(): 删除列表末尾的元素。
    list.pop_back();
    printList(list);

    // push_front(const T& value): 在列表头部添加元素。
    list.push_front(99);
    printList(list);

    // pop_front(): 删除列表头部的元素。
    list.pop_front();
    printList(list);

    // insert(iterator pos, const T& value): 在指定位置插入元素。
    list.insert(list.begin(), 1000);
    printList(list);

    // 在第5个位置加入888
    std::list<int>::iterator it = list.begin();
#if 0
    for (int i = 0; i < 5; i++)
    {
        it++;
    }
#else
    std::advance(it, 5);
#endif
    list.insert(it, 888); // 在it的位置加上888，it的指向没有变，此时指向888的下一个位置
    printList(list);

    // erase(iterator pos): 删除指定位置的元素。
    std::cout << *it << std::endl;

    list.erase(it); // 删除it位置之后，it就变成了悬空指针了
    printList(list);
    std::cout << *it << std::endl;

    // remove(const T& value): 删除列表中所有等于 value 的元素。
    list.remove(0);
    printList(list);

    // std::cout << *(++it) << std::endl; // 因为it变成了悬空指针，因此，出现了错误

    auto front = list.front();
    auto back = list.back();
    std::cout << "front = " << front << ", back = " << back << std::endl;

    list.sort();
    printList(list);

    list.reverse();
    printList(list);

    return 0;
}
